// #region ignoreMode
import { ReactNode } from 'react';
import { TreeNode } from '../store';

export enum ignoreEnum {
  none = 'none',
  parents = 'parents',
  children = 'children',
}
export type Parameters<T extends (...args: Array<any>) => any> = T extends (...args: infer P) => any
  ? P
  : never;
export type IgnoreType = keyof typeof ignoreEnum;
// #endregion ignoreMode

// #region API
// Tree API
// 方便获取 TypeScript 类型，写成枚举，但是为了打包体积减小，定义为 const ，并重新声明一个 JavaScript 数组
// const enum apiEnum {
//   'setData',
//   'setChecked',
//   'setCheckedKeys',
//   'checkAll',
//   'clearChecked',
//   'setSelected',
//   'setExpand',
//   'setExpandKeys',
//   'setExpandAll',
//   'getCheckedNodes',
//   'getCheckedKeys',
//   'getIndeterminateNodes',
//   'getSelectedNode',
//   'getSelectedKey',
//   'getExpandNodes',
//   'getExpandKeys',
//   'getCurrentVisibleNodes',
//   'getNode',
//   'getTreeData',
//   'getFlatData',
//   'getNodesCount',
//   'insertBefore',
//   'insertAfter',
//   'append',
//   'prepend',
//   'remove',
//   'filter',
//   'showCheckedNodes',
//   'loadRootNodes',
//   'scrollTo',
// }

// export const API_METHODS = [
//   'setData',
//   'setChecked',
//   'setCheckedKeys',
//   'checkAll',
//   'clearChecked',
//   'setSelected',
//   'setExpand',
//   'setExpandKeys',
//   'setExpandAll',
//   'getCheckedNodes',
//   'getCheckedKeys',
//   'getIndeterminateNodes',
//   'getSelectedNode',
//   'getSelectedKey',
//   'getExpandNodes',
//   'getExpandKeys',
//   'getCurrentVisibleNodes',
//   'getNode',
//   'getTreeData',
//   'getFlatData',
//   'getNodesCount',
//   'insertBefore',
//   'insertAfter',
//   'append',
//   'prepend',
//   'remove',
//   'filter',
//   'showCheckedNodes',
//   'loadRootNodes',
//   'scrollTo',
// ];

// export type ApiType = keyof typeof apiEnum;

// TreeSearch API
// const enum treeSearchApiEnum {
//   'clearKeyword',
//   'getKeyword',
//   'search',
// }

// export const TREE_SEARCH_API_METHODS = ['clearKeyword', 'getKeyword', 'search'];

// export type TreeSearchApiType = keyof typeof treeSearchApiEnum;
// #endregion API

// #region Placement
// export enum placementEnum {
//   'bottom-start' = 'bottom-start',
//   'bottom-end' = 'bottom-end',
//   'bottom' = 'bottom',
//   'top-start' = 'top-start',
//   'top-end' = 'top-end',
//   'top' = 'top',
// }

// export type PlacementType = keyof typeof placementEnum;
// #endregion Placement

// #region Scroll position
// export enum verticalPositionEnum {
//   top = 'top',
//   center = 'center',
//   bottom = 'bottom',
// }

// export type VerticalPositionType = keyof typeof verticalPositionEnum;
// #endregion Scroll position

// #region Drag
// export enum dragHoverPartEnum {
//   before = 'before',
//   body = 'body',
//   after = 'after',
// }
// #endregion Drag

export type TreeNodeKeyType = string | number;

export type RenderTreeNodeType = (node: TreeNode) => ReactNode;
